//
//  WBUserAccount.swift
//  czWB
//
//  Created by Qing on 2018/12/14.
//  Copyright © 2018年 成哥哥. All rights reserved.
//

import UIKit
import YYModel
import SVProgressHUD


/// 保存和读取用户帐户信息的本地路径
private let filePath = NSHomeDirectory() + "/Documents/userAccount.json"

@objcMembers class WBUserAccount: NSObject {

    /// 用户id
    var uid: String?
    
    /// 用户授权密钥
    var access_token: String?
    
    /// 生命周期，开发者是5年，其他用户是3天，开发者每次登录都会刷新时限，用户时限则不会。
    var expires_in: TimeInterval = 0 {
        
        didSet {
            
            expiresDate = Date(timeIntervalSinceNow: expires_in)
        }
    }
    
    /// 用户昵称
    var screen_name: String?
    
    /// 用户头像地址（大图），180×180像素
    var avatar_large: String?
    
    /// 过期日期
    var expiresDate: Date?

    /// 把内存名显示为 具体数字，如果不加这个，打印出来的是内存名
    override var description: String {
        
        let keys = ["uid", "access_token", "expires_in", "avatar_large", "screen_name"]
        
        return dictionaryWithValues(forKeys: keys).description
    }
    
    
    override init() {
        
        //        1.拼接路径
        //        2.读取文件
        //        3.Json二进制序列化
        //        4.Json转字典
        guard let data = (NSData(contentsOfFile: filePath)) as Data?,
            let jsonData = try? JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers),
            let dic = jsonData as? [String: Any]
            else {
                
                print("loadAccount: jsonData转换失败")
                return
        }
        
//        5.用字典设置属性值。 access_Token 有值(用户有登录)，无值（用户没登录）,无效(tonken过期，需重新登录)
        self.uid = dic["uid"] as? String ?? ""
        self.access_token = dic["access_token"] as? String ?? ""
        self.expiresDate = Date(timeIntervalSince1970: dic["expiresDate"] as? TimeInterval ?? 0)
        self.avatar_large = dic["avatar_large"] as? String ?? ""
        self.screen_name = dic["screen_name"] as? String ?? ""
        
//        print("转换前的日期\(self.expiresDate)")
//        self.expiresDate = Date(timeIntervalSinceNow: -16400 )
//       6.判断过期日期> 当前时间，则过期。否则为不过期。
        if expiresDate?.compare(Date()) != ComparisonResult.orderedDescending {
            
//            print("accessToken过期，请重新登录")
            
//           7.清空token信息
            self.access_token = nil
            self.uid = nil
//           8.删除用户本地信息文件
            try? FileManager.default.removeItem(atPath: filePath)
        }

    }
    
//    这个是yy_model的写法，中saveAccount方法一样效果。
//    override var description: String {
//
//        return yy_modelDescription()
//
//    }
    
    
    /// 保存用户帐户信息到本地
    func saveAccount()  {
        
//        把过期日期Date转换为String格式，因为Date不能直接转换为Json，
//        可以使用DateFormatter对象作为桥梁来实现Date与String之间的相互转换。
//        let formatter = DateFormatter()
//        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
//        let date = formatter.string(from: self.expiresDate!)
        
//        把过期日期转换为时间戳,因为日期不能直接转换为Json
//        时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
//        print("从JSON拿来的日期\(self.expiresDate)")
        let expires_Date = self.expiresDate?.timeIntervalSince1970
//        print("改变后的JSON日期\(expires_Date?.description)")
        
//       1.用字典设置Account属性，以便保存自己想要的属性。
        let dict: [String: Any] = ["uid": self.uid ?? "",
                                   "access_token": self.access_token ?? "",
                                   "expiresDate": expires_Date ?? 0,
                                   "avatar_large": avatar_large ?? "",
                                   "screen_name": screen_name ?? ""]


//        测试dcit是否能够转换成功,不成功则返回
        if !JSONSerialization.isValidJSONObject(dict) {
                print("WBUserAccount字典转换json失败")
            return
        }
//        看看转换成功后的字典
//        print("dict: -- \(dict)")
        
//        2.字典序列化
        guard let jsonData = try? JSONSerialization.data(withJSONObject: dict, options: []) else {
            
            print("WBUserAccount字典序列化失败")
            return
        }
        
//        3.写入磁盘
//        构建存储路径
//        let filePath = NSHomeDirectory() + "/Documents/userAccount.json"
//        打印路径出来看看是否储存成功，保存用户信息到磁盘
//        print("用户信息保存路径是\(filePath)")
        (jsonData as NSData).write(toFile: filePath, atomically: true)
        
    }
    
}
